import router from './router'
import { useUserStore } from './store/user'
import { usePermissionStore } from './store/permission'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { ElMessage } from 'element-plus'

// 配置NProgress
NProgress.configure({ showSpinner: false })

// 白名单路由（不需要登录就可以访问）
const whiteList = ['/login', '/register']

// 路由前置守卫
router.beforeEach(async (to, from, next) => {
  // 开始进度条
  NProgress.start()
  
  // 设置页面标题
  document.title = to.meta.title ? `${to.meta.title} - Easy Mall管理系统` : 'Easy Mall管理系统'
  
  // 获取用户store
  const userStore = useUserStore()
  const permissionStore = usePermissionStore()
  
  // 判断用户是否已登录
  if (userStore.token) {
    // 已登录状态下访问登录页，重定向到首页
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done()
    } else {
      // 判断用户信息是否已获取
      if (userStore.userInfo.id === 0) {
        try {
          // 获取用户信息
          await userStore.getUserInfo()
          
          // 生成可访问路由
          const accessRoutes = await permissionStore.generateRoutes()
          
          // 如果没有可访问路由，跳转到403页面
          if (accessRoutes.length === 0) {
            next({ path: '/403' })
          } else {
            // 正常访问
            next({ ...to, replace: true })
          }
        } catch (error) {
          // 获取用户信息失败，可能是token过期
          userStore.resetUserState()
          ElMessage.error('登录状态已过期，请重新登录')
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      } else {
        // 已有用户信息，检查是否有权限访问
        if (to.meta.roles && to.meta.roles.length > 0) {
          // 判断是否有权限访问
          const hasRole = userStore.userInfo.roles.some(role => {
            return (to.meta.roles as string[]).includes(role)
          })
          
          if (hasRole) {
            next()
          } else {
            next({ path: '/403' })
          }
        } else {
          // 没有设置权限要求，直接访问
          next()
        }
      }
    }
  } else {
    // 未登录状态
    if (whiteList.includes(to.path)) {
      // 在免登录白名单中，直接进入
      next()
    } else {
      // 其他页面重定向到登录页面
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

// 路由后置守卫
router.afterEach(() => {
  // 结束进度条
  NProgress.done()
})